#include<stdlib.h>
#include<cstring>
#include<errno.h>
#include<cstdio>
#include<iostream>
using namespace std;

#include<sys/types.h>
#include<sys/wait.h>
#include<signal.h>
#include<unistd.h>
#include<signal.h>

void handler(int sig)
{
    cout<<"我是一个进程，刚刚获取了一个信号： "<< sig <<endl;
    //exit(1);
}
void showPending(sigset_t * pendings)
{
    for(int sig=1;sig<=31;sig++)
    {
        if(sigismember(pendings,sig))
        {
            cout<<"1";
        }
        else
        {
            cout<<"0";
        }
    }
        cout<<endl;
}
int main()
{
    cout<<"pid: "<<getpid()<<endl;
    sigset_t bsig,obsig;
    sigemptyset(&bsig);
    sigemptyset(&obsig);
    for(int sig=1;sig<=31;sig++)
    {
        sigaddset(&bsig,sig);
        signal(sig,handler);
    }
    sigprocmask(SIG_SETMASK,&bsig,&obsig);//将当前进程阻塞所有信号

    sigset_t pendings;
    int cnt=0;
    while(true)
    {
        sigemptyset(&pendings);
        if(sigpending(&pendings)==0)
        {
            showPending(&pendings);
        }
        sleep(1);
        cnt++;
        if(cnt==20)
        {
            cout << "解除对2号信号的block...." << endl;
            sigset_t sigs;
            sigemptyset(&sigs);
            sigaddset(&sigs, 2);
            sigprocmask(SIG_UNBLOCK, &sigs, nullptr);
        }
    }

    // for(int sig=1;sig<=31;sig++)
    // {
    //     signal(sig,hander);
    // }
    //pid_t id=fork();
    //if(id==0)
    //{
    //    int a=10;
    //    a/=0;
        //exit(1);
    //}

    // int status=0;
    // int ret=waitpid(id,&status,0);
    // printf("exitcode: %d signal: %d,core dump flag:%d\n",(status>>8)&0xff,
    // status&0x7f,(status>>7)&0x1);
    return 0;
}